package br.com.controleVendas.config;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import br.com.controleVendas.dao.CidadeDao;
import br.com.controleVendas.dao.ClienteDao;
import br.com.controleVendas.dao.EstadoDao;
import br.com.controleVendas.dao.ParcelaVendaDao;
import br.com.controleVendas.dao.ProdutoDao;
import br.com.controleVendas.dao.VendaDao;
import br.com.controleVendas.dao.VendaProdutoDao;
import br.com.controleVendas.entity.Cidade;
import br.com.controleVendas.entity.Cliente;
import br.com.controleVendas.entity.Estado;
import br.com.controleVendas.entity.ParcelaVenda;
import br.com.controleVendas.entity.Produto;
import br.com.controleVendas.entity.Venda;
import br.com.controleVendas.entity.VendaProduto;

public class HibernateUtil
{
    private static HibernateUtil me;

    private ClienteDao           clienteDao;

    private EstadoDao            estadoDao;

    private CidadeDao            cidadeDao;

    private ProdutoDao           produtoDao;

    private VendaDao             vendaDao;

    private VendaProdutoDao      vendaProdutoDao;

    private ParcelaVendaDao      parcelaVendaDao;

    private SessionFactory       sessionFactory;

    private HibernateUtil()
    {
        Configuration c = new Configuration();
        c.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
                .setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/controle_vendas")
                .setProperty("hibernate.connection.username", "root").setProperty("hibernate.connection.password", "root")
                .setProperty("hibernate.c3p0.arquire_increment", "1").setProperty("hibernate.c3p0.idle_test_period", "100")
                .setProperty("hibernate.c3p0.min_size", "5").setProperty("hibernate.c3p0.max_size", "20")
                .setProperty("hibernate.c3p0.timeout", "1800").setProperty("hibernate.c3p0.max_statements", "50")
                .setProperty("hibernate.hbm2ddl.auto", "update").setProperty("hibernate.show_sql", "true")
                .setProperty("hibernate.format_sql", "false").addPackage("br.com.controleVendas.entity").addAnnotatedClass(Cidade.class)
                .addAnnotatedClass(Cliente.class).addAnnotatedClass(Estado.class).addAnnotatedClass(ParcelaVenda.class)
                .addAnnotatedClass(Produto.class).addAnnotatedClass(Venda.class).addAnnotatedClass(VendaProduto.class);

        // A SessionFactory is set up once for an application
        sessionFactory = c.buildSessionFactory(new StandardServiceRegistryBuilder().applySettings(c.getProperties()).build());

        clienteDao = new ClienteDao();
        estadoDao = new EstadoDao();
        cidadeDao = new CidadeDao();
        produtoDao = new ProdutoDao();
        vendaDao = new VendaDao();
        vendaProdutoDao = new VendaProdutoDao();
        parcelaVendaDao = new ParcelaVendaDao();

    }

    protected void tearDown()
        throws Exception
    {
        if(sessionFactory != null)
        {
            sessionFactory.close();
        }
    }

    public Session getSession()
    {
        Session toReturn = sessionFactory.openSession();
        return toReturn;
    }

    public static HibernateUtil getInstance()
    {
        if(me == null)
        {
            me = new HibernateUtil();
        }
        return me;
    }

    public CidadeDao getCidadeDao()
    {
        return cidadeDao;
    }

    public EstadoDao getEstadoDao()
    {
        return estadoDao;
    }

    public ClienteDao getClienteDao()
    {
        return clienteDao;
    }

    public ProdutoDao getProdutoDao()
    {
        return produtoDao;
    }

    public VendaDao getVendaDao()
    {
        return vendaDao;
    }

    public VendaProdutoDao getVendaProdutoDao()
    {
        return vendaProdutoDao;
    }

    public ParcelaVendaDao getParcelaVendaDao()
    {
        return parcelaVendaDao;
    }

}
